# 主程序
project(Exe)

add_executable(${PROJECT_NAME}
    ./src/main.cpp
    ./include/main.h
)

target_include_directories(${PROJECT_NAME}
    PUBLIC ./include
)

# GENERATOR EXPRESSION，用于跨平台的判断
# 这句语法的意思就是，如果CONFIG:Debug，则设置为1或0。
# 但是我在使用中，虽然使用了VS的DEBUG模式来运行，但是这个MY_DEBUG没有定义！
# 我后来找到BUG了，最后面的“,1,0>”的这一段，我使用了空格“, 1, 0>”。以前的编程习惯，但这里是不能加空格的。
set(IS_DEBUG_BUILD $<IF:$<CONFIG:Debug>,1,0>)

# 使用CMAKE_BUILD_TYPE来判断多项目配置
# if(CMAKE_BUILD_TYPE) 

# 定义预编译指令（直接定义）
# target_compile_definitions(${PROJECT_NAME} PRIVATE MY_DEBUG)
# target_compile_definitions(${PROJECT_NAME} PRIVATE MY_DEBUG=1)
# 定义预编译指令（结合上面的项目判断）
target_compile_definitions(${PROJECT_NAME} PRIVATE MY_DEBUG=${IS_DEBUG_BUILD})

# 设置编译器选项
# 这个-02是告诉编译器用什么样的优化。gcc使用-02，而msvc使用是/02。所以需要进行编译器的判断
# 但是我这里报错“cl : 命令行  warning D9002: 忽略未知选项“/02” [C:\Project\3D Learn\CMake\CMakeLib\build\Main\Exe.vcxproj]”
# 然后教程中使用了一个CHECK_CXX_COMPILER_FLAG的命令来确定是否有这个选项。需要include一个CheckCXXCompilerFlag。
include(CheckCXXCompilerFlag)
if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
    CHECK_CXX_COMPILER_FLAG(/02 FLAG_IS_OK)
    if(FLAG_IS_OK)
        target_compile_options(${PROJECT_NAME} PRIVATE /02)
    endif()
elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
    target_compile_options(${PROJECT_NAME} PRIVATE -02)
endif()

# 正常情况下会出现找不到.h的情况，这里我们不使用 target_include_directories(Exe PUBLIC ./) 指使
# 而是使用link指令，这样：
target_link_libraries(${PROJECT_NAME} PUBLIC Library)

# 使用option来配置是否构建 
if(BUILD_EXAMPLES)
    message(STATUS "Building examples.")
    # 使用遍历来设置多个执行文件
    file(GLOB_RECURSE EXAMPLE_SOURCES CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/examples/*.cpp")
    foreach(EXAMPLE_FILE IN LISTS EXAMPLE_SOURCES)
        # 获得文件名做为项目名
        get_filename_component(NAME_ONLY ${EXAMPLE_FILE} NAME_WE) # NAME_WE = Name without extension
        message(STATUS ${NAME_ONLY})    

        # 其它的和创建项目同样
        project(${NAME_ONLY})

        add_executable(${NAME_ONLY} ${EXAMPLE_FILE})

        target_include_directories(${PROJECT_NAME} PUBLIC ./include)

        target_link_libraries(${NAME_ONLY} PUBLIC Library)
    endforeach()
else()
    message(STATUS "Escape building examples.")
endif()